<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>


    <meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Using deferred loading of items and Carousel's built-in paginator</title>

<style type="text/css">
/*margin and padding on body element
  can introduce errors in determining
  element position and are not recommended;
  we turn them off as a foundation for YUI
  CSS treatments. */
body {
	margin:0;
	padding:0;
}
</style>

<link rel="stylesheet" type="text/css" href="../../build/fonts/fonts-min.css" />
<link rel="stylesheet" type="text/css" href="../../build/carousel/assets/skins/sam/carousel.css" />
<script type="text/javascript" src="../../build/yahoo-dom-event/yahoo-dom-event.js"></script>
<script type="text/javascript" src="../../build/connection/connection-min.js"></script>
<script type="text/javascript" src="../../build/element/element-min.js"></script>
<script type="text/javascript" src="../../build/carousel/carousel-min.js"></script>


<!--begin custom header content for this example-->
<style type="text/css">
    /* Style the spotlight container */
    #spotlight {
        border: 1px solid #ccc;
        height: 240px;
        margin: 10px auto;
        padding: 1px;
        text-align: center;
        width: 240px;
    }

    #carousel {
        margin: 0;
    }

    #container {
        margin: 0 auto;
    }

    /* Always be sure to give your carousel items a width and a height */
    .yui-carousel-element li {
        height: 75px;
        width: 75px;
    }

    /* Since for this example, we display more than the default 5 page buttons,
       by setting MAX_PAGER_BUTTONS, we increase the offset margin for IE6/7, to
       make space for the 6th button */
    .yui-skin-sam .yui-carousel-nav ul {
        *margin-left: -190px;
    }
</style>

<!--end custom header content for this example-->

</head>

<body class="yui-skin-sam">


<h1>Using deferred loading of items and Carousel's built-in paginator</h1>

<div class="exampleIntro">
	<p>This example extends <a href="http://developer.yahoo.com/yui/examples/carousel/csl_dynload2.html">Using Ajax for deferred loading of items</a> and demonstrates 
how to support <a href="http://developer.yahoo.com/yui/carousel/">YUI Carousel Control's</a> built-in paginator via the <code>replaceItem</code> method.</p>			
</div>

<!--BEGIN SOURCE CODE FOR EXAMPLE =============================== -->

<!-- The Carousel container -->
<div id="container">
    <ol id="carousel"></ol>
</div>
<!-- The spotlight container -->
<div id="spotlight"></div>
<script>
var curpos, batchSize, items = [];

function getImageTag(img) {
    return "<img src=\"" + img + "\" height=\"75\" width=\"75\">";
}

function getImages(o) {
    var carousel = this,
    revealEnabled = carousel.get("revealAmount"),
    numVisible = carousel.get("numVisible"),
    curpos = o.num > numVisible + (revealEnabled?1:0) ? o.last - (o.last % numVisible) : o.first;

    YAHOO.util.Connect.asyncRequest("GET", "assets/php/getimages2.php"+ "?r="+Math.random()+"&batchSize="+ batchSize + "&pos=" + curpos, {
        success: function (o) {
            var i = curpos,
            j = 0,
            r = eval("(" + o.responseText + ")"),
            item,
            loadingItems;

            curpos += r.length;

            while (i < curpos) {

                if (r[j]) {
                
                    item = getImageTag(r[j]);

                    loadingItems = carousel.getLoadingItems();

                    if(loadingItems[i]){
                        // We use replaceItem to swap out a placeholder loading item, which allows for backwards navigation. 
                        carousel.replaceItem(item,i);
                    } else {
                        carousel.addItem(item);
                    }

                } else {
                    break;
                }
                i++;
                j++;
            }

            carousel.set("selectedItem", carousel.get("firstVisible"));
        },

        failure: function (o) {
            alert("Ajax request failed!");
        }
    });
}

// Get the image link from within its (parent) container.
function getLargeImage(parent) {
    var el = parent.firstChild;

    while (el) { // walk through till as long as there\'s an element
    if (el.nodeName.toUpperCase() == "IMG") { // found an image
        // flickr uses "_s" suffix for small, and "_m" for big
        // images respectively
        return el.src.replace(/_s\.jpg$/, "_m.jpg");
    }
    el = el.nextSibling;
}
return "";
}

YAHOO.util.Event.onDOMReady(function (ev) {

    var carousel, spotlight = YAHOO.util.Dom.get("spotlight");

    /* Allow for anchor pagination to better demonstrate backwards loading. 
       Note: MAX_PAGER_BUTTONS defaults to 5 making a Carousel with more than
       5 pages spawn a select box containing pages instead of page anchors. */

    YAHOO.widget.Carousel.prototype.CONFIG.MAX_PAGER_BUTTONS = 100;

    carousel = new YAHOO.widget.Carousel("container", {
        /* Setting numItems is required for dynamic loading. This property lets Carousel 
           know how many total items it will ever be populated with.
           Not to be confused with numVisible: the number of items to display
           per page. In this case we don't specify it and Carousel 
           defaults to 3 items visible per page. */

        numItems: 17
    });

    batchSize = carousel.get("numVisible");

    YAHOO.util.Connect.asyncRequest("GET", "assets/php/getimages2.php" + "?r="+Math.random()+"&batchSize=" + batchSize, {
        success: function (o) {
            var i, r = eval("(" + o.responseText + ")");

            curpos = r.length;

            for (i = 0; i < curpos; i++) {
                items.push(r[i]);
            }

            // check if the Carousel widget is available
            if (typeof carousel != "undefined") {
                for (i = 0; i < curpos; i++) {
                    // if so, shove the elements into it
                    carousel.addItem(getImageTag(items[i]));
                }
                carousel.set("selectedItem", 0);
                items = [];
            }
        },

        failure: function (o) {
            alert("Ajax request failed!");
        }
    });

    carousel.on("loadItems", function (o) {
        // more items available?
        getImages.call(this, o);
    });

    carousel.on("itemSelected", function (index) {
        // item has the reference to the Carousel\'s item
        var item = carousel.getElementForItem(index);

        if (item) {
            spotlight.innerHTML = "<img src=\""+getLargeImage(item)+"\">";
        }
    });

    carousel.render();
    carousel.show();
});
</script>
<!--END SOURCE CODE FOR EXAMPLE =============================== -->

</body>
</html>
